GLOBAL  _read_msw,_lidt, _lgdt
GLOBAL  _int_08_hand
GLOBAL  _int_09_hand
GLOBAL  _int_74_hand
GLOBAL  _mascaraPIC1,_mascaraPIC2,_Cli,_Sti
GLOBAL  _debug
GLOBAL 	get_gdtr_limit, get_gdtr_base

EXTERN  int_74
EXTERN  int_08
EXTERN  int_09

SECTION .text

get_gdtr_limit:
	sgdt	[table]
	mov		ax,[table]
	ret

get_gdtr_base:
	sgdt	[table]
	mov		eax,[table+1]
	shr		eax,8
	ret


_Cli:
	cli			; limpia flag de interrupciones
	ret

_Sti:
	sti			; habilita interrupciones por flag
	ret

_mascaraPIC1:			; Escribe mascara del PIC 1
		push    ebp
        mov     ebp, esp
        mov     ax, [ss:ebp+8]  ; ax = mascara de 16 bits
        out	21h,al
        pop     ebp
        retn

_mascaraPIC2:			; Escribe mascara del PIC 2
		push    ebp
        mov     ebp, esp
        mov     ax, [ss:ebp+8]  ; ax = mascara de 16 bits
        out	0A1h,al
        pop     ebp
        retn

_read_msw:
        smsw    ax		; Obtiene la Machine Status Word
        retn


_lgdt:   ; Carga el GDTR
		push    ebp
        mov     ebp, esp
        push    ebx
        mov     ebx, [ss: ebp + 6] ; ds:bx = puntero a GDTR
		rol	ebx,16
		lgdt    [ds: ebx]         ; carga GDTR
        pop     ebx
        pop     ebp
        retn

_lidt:				; Carga el IDTR
        push    ebp
        mov     ebp, esp
        push    ebx
        mov     ebx, [ss: ebp + 6] ; ds:bx = puntero a IDTR
		rol	ebx,16
		lidt    [ds: ebx]          ; carga IDTR
        pop     ebx
        pop     ebp
        retn


_int_08_hand:				; Handler de INT 0x8 ( Timer tick )
	    call    int_08		; Llama a funcion en C que maneja la interrupcion
        iret


_int_09_hand:				; Handler de INT 0x9 ( Teclado )
		call	int_09		; Llama a funcion en C que maneja la interrupcion
        iret

_int_74_hand:				; Handler de INT 0x74 ( Mouse )
		call	int_74		; Llama a funcion en C que maneja la interrupcion
        iret



; Debug para el BOCHS, detiene la ejecució; Para continuar colocar en el BOCHSDBG: set $eax=0

_debug:
        push    bp
        mov     bp, sp
        push	ax
vuelve:	mov     ax, 1
        cmp	ax, 0
	jne	vuelve
	pop	ax
	pop     bp
        retn

SECTION .data

table dw 64
